home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1994 #2
/
Monster Media No. 2 (Monster Media)(1994).ISO
/
soundu
/
dilaudid.zip
/
PLAYENGN.BAS
< prev
next >
Wrap
BASIC Source File
|
1993-11-17
|
7KB
|
218 lines
DECLARE SUB doplay (dat$)
DECLARE SUB d1 ()
DECLARE SUB d2 ()
DECLARE SUB playnote (note$, oct%)
DECLARE SUB stopplay ()
DECLARE SUB setoptions (am%, vibrato%, sustain%, harmonic%)
DECLARE SUB setlevel (level%)
DECLARE SUB setad (attack%, decay%)
DECLARE SUB setsr (sustain%, release%)
DECLARE SUB setwave (wavetype%)
DECLARE SUB delay ()
DEFINT A-Z
COMMON SHARED curvoice, curoctave, curlength, deflength, curtempo
curtempo = 120
file$ = COMMAND$
IF file$ = "" THEN
PRINT "playengn FILENAME"
END
END IF
deflength = 16 'quarter note default
FOR curvoice = 0 TO 2
setoptions 0, 0, 0, 1
setlevel 60
setad 9, 2
setsr 4, 4
setwave 0
NEXT
curvoice = 0
CLS
OPEN file$ FOR INPUT AS #1
DO
IF NOT (EOF(1)) THEN INPUT #1, x$
doplay x$
LOOP UNTIL EOF(1) OR INKEY$ <> ""
CLOSE
SUB d1
FOR r = 1 TO 6: x = INP(&H388): NEXT
END SUB
SUB d2
FOR r = 1 TO 35: x = INP(&H388): NEXT
END SUB
SUB delay
x# = (1 / curlength) * (60 / curtempo)
xx# = TIMER + x#
DO UNTIL TIMER > xx#: LOOP
END SUB
SUB doplay (dat$)
curvoice = curvoice + 1
IF curvoice = 3 THEN curvoice = 0
COLOR 7
x$ = LTRIM$(RTRIM$(LCASE$(dat$))) + " "
SELECT CASE MID$(x$, 1, 1)
CASE "o" 'octave change
curoctave = VAL(MID$(x$, 2))
PRINT x$ + " ";
CASE "m" 'legato, normal, stacato
PRINT x$ + " ";
CASE "l" 'length
deflength = VAL(MID$(x$, 2))
PRINT x$ + " ";
CASE "p" 'pause
curlength = VAL(MID$(x$, 2))
delay
PRINT x$ + " ";
CASE ">" 'up octave
PRINT x$ + " ";
CASE "<" 'dn octave
PRINT x$ + " ";
CASE "t" 'tempo
curtempo = VAL(MID$(x$, 2))
PRINT x$ + " ";
CASE "a" TO "g" 'note
IF MID$(x$, 2, 1) = "#" OR MID$(x$, 2, 1) = "+" OR MID$(x$, 2, 1) = "-" THEN
n$ = MID$(x$, 1, 2)
curlength = VAL(MID$(x$, 3))
ELSE
n$ = MID$(x$, 1, 1)
curlength = VAL(MID$(x$, 2))
END IF
IF curlength = 0 THEN curlength = deflength
stopplay
playnote n$, curoctave
COLOR 15
PRINT n$ + "/o" + LTRIM$(RTRIM$(STR$(curoctave))) + "/d" + LTRIM$(RTRIM$(STR$(curlength))) + " ";
delay
CASE ELSE
COLOR 12
PRINT x$ + " ";
END SELECT
END SUB
SUB playnote (note$, oct)
SELECT CASE LCASE$(note$)
CASE "c#", "c+", "d-"
msb = &H1: lsb = &H6B
CASE "d"
msb = &H1: lsb = &H81
CASE "d#", "d+", "e-"
msb = &H1: lsb = &H98
CASE "e"
msb = &H1: lsb = &HB0
CASE "f"
msb = &H1: lsb = &HCA
CASE "f#", "f+", "g-"
msb = &H1: lsb = &HE5
CASE "g"
msb = &H2: lsb = &H2
CASE "g#", "g+", "a-"
msb = &H2: lsb = &H20
CASE "a"
msb = &H2: lsb = &H41
CASE "a#", "a+", "b-"
msb = &H2: lsb = &H63
CASE "b"
msb = &H2: lsb = &H87
CASE "c"
msb = &H2: lsb = &HAE
CASE ELSE
COLOR 12
PRINT "ERR ";
END SELECT
OUT &H388, &HA0 + curvoice: d1
OUT &H389, lsb: d2
OUT &H388, &HA3 + curvoice: d1
OUT &H389, lsb: d2
OUT &H388, &HB0 + curvoice: d1
OUT &H389, msb + (oct * 4) + 32: d2
OUT &H388, &HB3 + curvoice: d1
OUT &H389, msb + (oct * 4) + 32: d2
END SUB
SUB setad (attack, decay)
OUT &H388, &H60 + curvoice: d1
OUT &H389, (attack * 16) + decay: d2
OUT &H388, &H63 + curvoice: d1
OUT &H389, (attack * 16) + decay: d2
END SUB
SUB setlevel (level)
OUT &H388, &H40 + curvoice: d1
OUT &H389, (63 - level): d2
OUT &H388, &H43 + curvoice: d1
OUT &H389, (63 - level): d2
END SUB
SUB setoptions (am, vibrato, sustain, harmonic)
temp = 0
IF am THEN temp = 128
IF vibrato THEN temp = temp + 64
IF sustain THEN temp = temp + 32
' harmonic options:
' 0 - one octave below
' 1 - at the voice's specified frequency
' 2 - one octave above
' 3 - an octave and a fifth above
' 4 - two octaves above
' 5 - two octaves and a major third above
' 6 - two octaves and a fifth above
' 7 - two octaves and a minor seventh above
' 8 - three octaves above
' 9 - three octaves and a major second above
' 10 - three octaves and a major third above
' 11 - " " " " " " "
' 12 - three octaves and a fifth above
' 13 - " " " " " "
' 14 - three octaves and a major seventh above
' 15 - " " " " " " "
temp = temp + harmonic
OUT &H388, &H20 + curvoice: d1
OUT &H389, temp: d2
OUT &H388, &H23 + curvoice: d1
OUT &H389, temp: d2
END SUB
SUB setsr (sustain, release)
OUT &H388, &H80 + curvoice: d1
OUT &H389, ((15 - sustain) * 16) + release: d2
OUT &H388, &H83 + curvoice: d1
OUT &H389, ((15 - sustain) * 16) + release: d2
END SUB
SUB setwave (wavetype)
OUT &H388, &HE0 + curvoice: d1
' ___ ___ ___ ___ _ _
' / \ / \ / \ / \ / | / |
' /_____\_______ /_____\_____ /_____\/_____\ /__|___/__|___
' \ /
' \___/
' -0- -1- -2- -3-
OUT &H389, wavetype: d2
OUT &H388, &HE3 + curvoice: d1
OUT &H389, wavetype: d2
END SUB
SUB stopplay
OUT &H388, &HB0 + curvoice: d1
OUT &H389, 0: d2
OUT &H388, &HB3 + curvoice: d1
OUT &H389, 0: d2
END SUB